#include "eje5_comun.h"

extern "C"
{
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/stat.h>
    #include <fcntl.h>
}

int abrir_fifo(const char* nombre_fifo, const int permisos, const int flags, const int crear)
{
    if(!nombre_fifo || 0==strcmp(nombre_fifo,""))
    {
        printf("Error al abrir fifo; nombre invalido.\n");
        exit(1);
    }    

    if(crear)
    {
        if(( mkfifo(nombre_fifo, permisos) ) < 0)
        {
            printf("Error en mkfifo.\n");
            exit(1);
        }
    }    

    int descriptor_fifo = open(nombre_fifo, flags);
    if (descriptor_fifo < 0)
    {
        printf("Error en el archivo FIFO.\n");
        if(crear)
            unlink(nombre_fifo);
        exit(1);
    }

    return descriptor_fifo;
}


int cerrar_fifo(const int descriptor_fifo, const char* nombre_fifo)
{
    if(descriptor_fifo)
        close(descriptor_fifo);

    if(nombre_fifo)
        unlink(nombre_fifo);
}


int leer_mensaje(const int descriptor, struct MENSAJE * msg)
{
    if( read(descriptor, msg, sizeof(struct MENSAJE)) == 0 )
    {
        // Si no se puede leer
        return -1;
    }
    
    return 0;
}


char const* nombre_fifo_cliente(const pid_t pid)
{
    static char aux[256];
    sprintf(aux, "./fifo_%d", pid);

    return aux;
}